	/**
	 * Capteur est la classe représentant un capteur intérieur ou extérieur
	 * @author smathomeutbm
	 * @version 1.0
	 */
public class Capteur implements Runnable{
	
	private String nomCapteur;
	private int tps;
	private Piece piece;
	private ParametreExterieur paramExt;
	private boolean estEnAction;
	
	/**
     * Constructeur par défaut de Capteur
     */
	public Capteur() {
		this.nomCapteur = "";
		this.tps = 0;
		this.piece = null;
		this.paramExt = null;
		estEnAction = false;
	}
	
	/**
     * Constructeur de base avec les paramètres nom et temps
     * @param nomCapteur Nom du capteur
     * @param tps Temps en secondes pour changer d'une unité
     */	
	public Capteur(String nomCapteur, int tps) {
		this.nomCapteur = nomCapteur;
		this.tps = tps;
		estEnAction = false;
	}
	
	/**
     * Constructeur de capteur extérieur
     * @param nomCapteur Nom du capteur
     * @param paramExt Paramètre extérieur que le capteur va contrôller
     * @param tps Temps en secondes pour changer d'une unité
     */
	public Capteur(String nomCapteur, ParametreExterieur paramExt, int tps) {
		this(nomCapteur, tps);
		this.paramExt = paramExt;
		this.piece = null;
	}
	
	/**
     * Constructeur de capteur intérieur
     * @param nomCapteur Nom du capteur
     * @param piece Pièce que le capteur va contrôller
     * @param tps Temps en secondes pour changer d'une unité
     */
	public Capteur(String nomCapteur, Piece piece, int tps) {
		this(nomCapteur, tps);
		this.piece = piece;
		this.paramExt = null;
	}
	
	/**
     * Retourne la valeur du capteur
     * @return La valeur du capteur
     */
	public float getValeurParam(){
		if (this.piece != null) {
			String[] typeCapteur = nomCapteur.split("_");
			if(typeCapteur[0].equals("temperature")) return this.piece.getTemperaturePiece();
			if(typeCapteur[0].equals("presence")) return (this.piece.getPresence()) ? 1.0f : 0.0f;
			if(typeCapteur[0].equals("lumiere"))  return (this.piece.getLumiere()) ? 1.0f : 0.0f;
		}
		else if(this.paramExt != null){
			return paramExt.getValeurExt();
		}
		return 0;
	}
	
	/**
     * Modifier la valeur du capteur grâce à un thread
     * @return true si l'exécution c'est bien passé
     */
	public boolean modifierVar() {
		if(!estEnAction){
			final Thread t = new Thread(this);
			t.start();
			return true;
		}else{
			return false;
		}
	}
	
	@SuppressWarnings("static-access")
	/**
     * Gestion du thread qui va changer la valeur du capteur, en fonction du temps
     * @throws InterruptedException  si le thread ne peut pas faire sleep()
     */
	public void run() {
		estEnAction = true;
		float valeurCapteur = this.getValeurParam();
		String[] typeCapteur = nomCapteur.split("_");
		if((typeCapteur[0].equals("presence")) || (typeCapteur[0].equals("lumiere"))){ //Traitement d'un capteur de présence
			if(valeurCapteur == 0)
				this.setValeur(1);
			else
				this.setValeur(0);
		}
		if(typeCapteur[0].equals("temperature")){ //Traitement d'un capteur de temperature
			float valeurVoulu = this.piece.getTemperatureVoulu();
			while(valeurCapteur != valeurVoulu){
				if(Math.abs(valeurCapteur - valeurVoulu) < 1){
					this.setValeur(valeurVoulu);
				} else if (valeurCapteur < valeurVoulu){
					valeurCapteur++;
					this.setValeur(valeurCapteur);
				} else if (valeurCapteur > valeurVoulu){
					valeurCapteur--;
					this.setValeur(valeurCapteur);
				}
				System.out.println("Modif capteur name=" + this.nomCapteur + " valeur=" + this.getValeurParam());
					try {
						Thread.currentThread().sleep(tps*1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				valeurCapteur = this.getValeurParam(); //Mise à jour de la valeur du capteur
			}
		}
		estEnAction = false;
	}
	
	/**
     * Modifier la valeur du capteur en fonction de son type
     * @param valeur Nouvelle valeur du capteur
     */
	private void setValeur(float valeur){
		if (this.piece != null) {
			String[] typeCapteur = nomCapteur.split("_");
			if(typeCapteur[0].equals("temperature")) this.piece.setTemperaturePiece(valeur);
			if(typeCapteur[0].equals("presence")){
				if(valeur == 1)
					this.piece.setPresence(true);
				else
					this.piece.setPresence(true);
			}
			if(typeCapteur[0].equals("lumiere")) {
				if(valeur == 1)
					this.piece.setLumiere(true);
				else
					this.piece.setLumiere(false);
		
			}
		}
	}
	
	/**
     * Récupérer le nom du capteur
     * @return Le nom du capteur
     */
	public String getNomCapteur() {
		return nomCapteur;
	}
	
	/**
     * Récupérer le temps du capteur
     * @return Le temps du capteur
     */
	public int getTps() {
		return tps;
	}

	/**
     * Récupérer la pièce associé au capteur
     * @return La pièce
     */
	public Piece getPiece() {
		return piece;
	}

	/**
     * Récupérer le paramètre extérieur associé au capteur
     * @return Le paramètre extérieur
     */
	public ParametreExterieur getParamExt() {
		return paramExt;
	}

	/**
     * String de Capteur
     * @return Chaîne
     */
	public String toString() {
		return "Capteur : nomCapteur=" + nomCapteur + ", paramExt="
				+ paramExt + ", piece=" + piece + ", tps=" + tps;
	}
	
	/**
     * Chaîne XML correspondant au capteur
     * @return Chaîne xml
     */
	public String xml() {
		String[] typeCapteur = nomCapteur.split("_");
		return "\t\t<capteur name=\"" + typeCapteur[0] + "\" tps=\"" + tps + "\" />\n";
	}
}
